package com.example.common.utils;

import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import java.util.ArrayList;
import java.util.List;

public class PageUtil {
    /**
     * 将列表数据转为伪分页结构
     * @param list 全量列表
     * @param page 当前页（页数从0开始）
     * @param size 每页数量
     * @param <T> 数据类型
     * @return 当前页的数据子集
     */
    public static <T> List<T> paginateList(List<T> list, int page, int size) {
        int fromIndex = page * size;
        int toIndex = Math.min(fromIndex + size, list.size());
        if (fromIndex > toIndex || fromIndex > list.size()) {
            return new ArrayList<>(); // 返回空列表
        }
        return list.subList(fromIndex, toIndex);
    }
    
    /**
     * 构造分页请求对象
     * @param page 0-based页码
     * @param size 每页数量
     * @param sortField 排序字段，null时无排序
     * @param asc 是否升序，false为降序
     * @return Pageable实例
     */
    public static Pageable createPageable(int page, int size, String sortField, boolean asc) {
        if (page < 0) page = 0;
        if (size < 1) size = 10; // 默认每页10条
        
        if (sortField == null || sortField.isEmpty()) {
            return PageRequest.of(page, size);
        }
        Sort sort = asc ? Sort.by(sortField).ascending() : Sort.by(sortField).descending();
        return PageRequest.of(page, size, sort);
    }
    
    /**
     * 计算总页数
     */
    public static int calculateTotalPages(long totalItems, int pageSize) {
        if (pageSize <= 0) return 0;
        return (int) Math.ceil((double) totalItems / pageSize);
    }
    
    /**
     * 判断分页参数是否有效
     */
    public static boolean isValidPageRequest(int page, int size) {
        return page >= 0 && size > 0;
    }
    /**
     * 计算偏移量
     */
    public static int calculateOffset(int page, int size) {
        if (page < 0) page = 0;
        if (size <= 0) size = 10; // 默认大小
        return page * size;
    }
    
    /**
     * 判断当前页是否为第一页
     */
    public static boolean isFirstPage(int page) {
        return page <= 0;
    }
    
    /**
     * 判断当前页是否为最后一页
     */
    public static boolean isLastPage(int page, int totalPages) {
        return page >= totalPages - 1;
    }
    
    /**
     * 获取下一页页码（不会超过总页数）
     */
    public static int getNextPage(int page, int totalPages) {
        if (isLastPage(page, totalPages)) {
            return page;
        }
        return page + 1;
    }
    
    /**
     * 获取上一页页码（不会小于0）
     */
    public static int getPreviousPage(int page) {
        if (isFirstPage(page)) {
            return 0;
        }
        return page - 1;
    }
}
